package com.loveprogrammer.eternity.factory;

import com.loveprogrammer.eternity.enums.QualityEnum;
import com.loveprogrammer.eternity.factory.template.EffectTemplate;
import com.loveprogrammer.eternity.model.affix.Affix;
import com.loveprogrammer.eternity.model.product.Equipment;
import org.reflections.Reflections;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @version 1.0.0
 * @description: 词缀工厂
 * @author: eric
 * @date: 2022-08-24 18:19
 **/
public class AffixFactory {


    private static List<Affix> affixList;
    private static Map<Integer, List<Affix>> groupByOrder = new HashMap<>();

    static {
        affixList = new ArrayList<>();
        // 扫描所有实现了Affix接口的类，并装配进去
        Reflections reflections = new Reflections("com.loveprogrammer.eternity.model.affix");
        //Affix 是个接口，获取在指定包扫描的目录所有的实现类
        Set<Class<? extends Affix>> classes = reflections.getSubTypesOf(Affix.class);
        for (Class<? extends Affix> aClass : classes) {
            // System.out.println(aClass.getName());
            try {
                affixList.add(aClass.newInstance());
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        // 先排序 再分组
        affixList.sort(Comparator.comparing(Affix::group));
        groupByOrder = affixList.stream().collect(Collectors.groupingBy(Affix::group));
    }

    public static List<Affix> getAll() {
        return affixList;
    }

    public static Equipment setAffix(Equipment equipment) {
        // 前缀
        List<Affix> affixes = new ArrayList<>();
        // 白色蓝色（0-1个） 黄色（1-2个） 紫色（2） 红色（2-3） 暗金（2-4个） 绿色（2-4）
        QualityEnum quality = equipment.getQuality();
        String code = quality.getCode();

        List<Affix> affixesLevelOne;
        List<Affix> affixesLevelTwo;
        List<Affix> affixesLevelThree;
        List<Affix> affixesLevelFour;
        switch (code) {
            case "white":
                // 白色 40%
                if (new Random().nextInt(100) < 40) {
                    affixesLevelOne = groupByOrder.get(1);
                    Collections.shuffle(affixesLevelOne);
                    affixes.add(affixesLevelOne.get(0));
                }
                break;
            case "blue":
                // 蓝色 80%
                if (new Random().nextInt(100) < 80) {
                    affixesLevelOne = groupByOrder.get(1);
                    Collections.shuffle(affixesLevelOne);
                    affixes.add(affixesLevelOne.get(0));
                }
                break;
            case "yellow":
                // 黄色 100%
                affixesLevelOne = groupByOrder.get(1);
                Collections.shuffle(affixesLevelOne);
                affixes.add(affixesLevelOne.get(0));
                // 第二个50%
                if (new Random().nextInt(100) < 50) {
                    affixesLevelTwo = groupByOrder.get(2);
                    Collections.shuffle(affixesLevelTwo);
                    affixes.add(affixesLevelTwo.get(0));
                }
                break;
            case "purple":
                // 紫色 100%
                affixesLevelOne = groupByOrder.get(1);
                Collections.shuffle(affixesLevelOne);
                affixes.add(affixesLevelOne.get(0));
                // 第二个100%
                affixesLevelTwo = groupByOrder.get(2);
                Collections.shuffle(affixesLevelTwo);
                affixes.add(affixesLevelTwo.get(0));
                break;
            case "red":
                // 红色 100%
                affixesLevelOne = groupByOrder.get(1);
                Collections.shuffle(affixesLevelOne);
                affixes.add(affixesLevelOne.get(0));
                // 第二个100%
                affixesLevelTwo = groupByOrder.get(2);
                Collections.shuffle(affixesLevelTwo);
                affixes.add(affixesLevelTwo.get(0));
                // 第三个50%
                if (new Random().nextInt(100) < 50) {
                    affixesLevelThree = groupByOrder.get(3);
                    Collections.shuffle(affixesLevelThree);
                    affixes.add(affixesLevelThree.get(0));
                }
                break;
            case "gold":
                // 暗金 100%
                affixesLevelOne = groupByOrder.get(1);
                Collections.shuffle(affixesLevelOne);
                affixes.add(affixesLevelOne.get(0));
                // 第二个100%
                affixesLevelTwo = groupByOrder.get(2);
                Collections.shuffle(affixesLevelTwo);
                affixes.add(affixesLevelTwo.get(0));
                // 第三个80%
                if (new Random().nextInt(100) < 80) {
                    affixesLevelThree = groupByOrder.get(3);
                    Collections.shuffle(affixesLevelThree);
                    affixes.add(affixesLevelThree.get(0));
                }
                // 第四个5%
                if (new Random().nextInt(100) < 5) {
                    affixesLevelFour = groupByOrder.get(4);
                    Collections.shuffle(affixesLevelFour);
                    affixes.add(affixesLevelFour.get(0));
                }
                break;
            case "green":
                // 绿色 100%
                affixesLevelOne = groupByOrder.get(1);
                Collections.shuffle(affixesLevelOne);
                affixes.add(affixesLevelOne.get(0));
                // 第二个100%
                affixesLevelTwo = groupByOrder.get(2);
                Collections.shuffle(affixesLevelTwo);
                affixes.add(affixesLevelTwo.get(0));
                // 第三个60%
                if (new Random().nextInt(100) < 60) {
                    affixesLevelThree = groupByOrder.get(3);
                    Collections.shuffle(affixesLevelThree);
                    affixes.add(affixesLevelThree.get(0));
                }
                // 第四个20%
                if (new Random().nextInt(100) < 20) {
                    affixesLevelFour = groupByOrder.get(4);
                    Collections.shuffle(affixesLevelFour);
                    affixes.add(affixesLevelFour.get(0));
                }
                break;
        }
        if (!affixes.isEmpty()) {
            for (Affix affix : affixes) {
                equipment = affix.addEffect(equipment);
                equipment.getAffixList().add(affix.affix());
            }
        }
        // 后缀
        addSuffix(equipment);
        return equipment;
    }

    private static void addSuffix(Equipment equipment) {
        String code = equipment.getQuality().getCode();
        switch (code) {
            // 紫色
            case "purple":
                // 10%
                if (new Random().nextInt(100) < 2) {
                   List<EffectTemplate> effects = EffectFactory.getRandomEffectTemplate(1);
                   if(effects.size() > 0){
                       equipment.gainSuffixEffects(effects);
                   }
                }
                break;
            // 红色
            case "red":
                // 30%
                if (new Random().nextInt(100) < 15) {
                    List<EffectTemplate> effects = EffectFactory.getRandomEffectTemplate(1);
                    if(effects.size() > 0){
                        equipment.gainSuffixEffects(effects);
                    }
                }
                break;
            // 暗金
            case "gold":
                // 60%
                if (new Random().nextInt(100) < 30) {
                    List<EffectTemplate> effects = EffectFactory.getRandomEffectTemplate(1);
                    if(effects.size() > 0){
                        equipment.gainSuffixEffects(effects);
                    }
                }
                break;
        }
    }


    public static Equipment setAffix(Equipment equipment, int num) {
        List<Affix> affixes = new ArrayList<>();
        // 白色蓝色（0-1个） 黄色（1-2个） 紫色（2） 红色（2-3） 暗金（2-4个） 绿色（2-4）
        QualityEnum quality = equipment.getQuality();
        String code = quality.getCode();

        List<Affix> affixesLevelOne;
        List<Affix> affixesLevelTwo;
        List<Affix> affixesLevelThree;
        List<Affix> affixesLevelFour;

        if (num > 0) {
            affixesLevelOne = groupByOrder.get(1);
            Collections.shuffle(affixesLevelOne);
            affixes.add(affixesLevelOne.get(0));
        }
        if (num > 1) {
            // 第二个100%
            affixesLevelTwo = groupByOrder.get(2);
            Collections.shuffle(affixesLevelTwo);
            affixes.add(affixesLevelTwo.get(0));
        }
        if (num > 2) {
            affixesLevelThree = groupByOrder.get(3);
            Collections.shuffle(affixesLevelThree);
            affixes.add(affixesLevelThree.get(0));
        }
        // 第四个20%
        if (num > 3) {
            affixesLevelFour = groupByOrder.get(4);
            Collections.shuffle(affixesLevelFour);
            affixes.add(affixesLevelFour.get(0));
        }

        if (!affixes.isEmpty()) {
            for (Affix affix : affixes) {
                equipment = affix.addEffect(equipment);
                equipment.getAffixList().add(affix.affix());
            }
        }
        return equipment;
    }

    public static void main(String[] args) {
        System.out.println("初始化");
        System.out.println(affixList.size());
    }
}
